package miravalles.chip;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Currency;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Map;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.preference.PreferenceManager;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;
import android.widget.Toast;

public class BoteActivity extends Activity  implements OnClickListener
					, LocationListener {
    /** Called when the activity is first created. */
	
	private static final String SEPARADOR="\t";
	private static final String FIN_LINEA ="\r\n";

	public static String clavesBotes[] =
				new String [] { "", "b1", "b2", "b3" };
	public String nombresBotes[]= 
				new String [] {
						"Bote actual", "Bote 2", "Bote 3", "Bote 4"};
	
	
	String lugar="";
	int    boteActivo=0;
	public int getBoteActivo() {
		return boteActivo;
	}

	public void setBoteActivo(int boteActivo) {
		
		this.boteActivo = boteActivo;
	}

	Double latitud=null;
	Double longitud=null;
	View zonaBote;
	
	private List<Atajo> atajos=new ArrayList<Atajo>();
	
	TextView campoBote;
	ImageButton	  sumar;
	TextView 	  campoCantidad;
	TableLayout   tablaHistorial;
	ViewGroup	  pagina0;
	ViewGroup	  pagina1;
	ViewPager	  vp;
	View		  botonElegirBote;

	private static final String PERS_HISTORIAL="persHistorial";
	
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
    	
        super.onCreate(savedInstanceState);
        
        cargarNombresBotes();

        LayoutInflater inflater = (LayoutInflater)getSystemService
      	      (Context.LAYOUT_INFLATER_SERVICE);

        ViewGroup root=(ViewGroup)inflater.inflate(R.layout.main, null);
    	setContentView(root);

        pagina0=(ViewGroup)inflater.inflate(R.layout.apuntar, null);        
        pagina1=(ViewGroup)inflater.inflate(R.layout.historial, null);
        
        vp=new ViewPager(this);
        root.addView(vp);
        vp.setAdapter(new PagerAdapter() {
			
			@Override
			public boolean isViewFromObject(View arg0, Object arg1) {
				return arg0==arg1;
			}
			
			@Override
			public int getCount() {			
				return 2;
			}
			
			@Override
			public Object instantiateItem(ViewGroup container, int position) {
				View vista;
				if(position==0) {
					vista=pagina0;
				} else {
					vista=pagina1;
				}
				container.addView(vista);
				return vista;
			}
        	
        });
        vp.setCurrentItem(0);
        

        campoBote=(TextView)findViewById(R.id.bote);
        campoCantidad=(TextView)findViewById(R.id.cantidad);
        tablaHistorial=(TableLayout)findViewById(R.id.tablaHistorial);
               
        zonaBote=findViewById(R.id.zonaBote);
        
        // zonaBote.setBackgroundColor(0xFF224466);
        findViewById(R.id.zonaApunte).setBackgroundColor(0xFF335588);
        findViewById(R.id.zonaHistorial).setBackgroundColor(0xFF226644);
        
        botonElegirBote=findViewById(R.id.botonElegirBote);
        botonElegirBote.setOnClickListener(this);
        
        campoBote.setBackgroundColor(0x00); // Transparente.
        campoBote.setTextColor(0xFFFFFFFF); // Blanco 
        campoBote.setBackgroundDrawable(null);
    
        atajos.add(new Atajo(this, string(R.string.bar), R.id.vino, "b1"));
        atajos.add(new Atajo(this, string(R.string.tienda), R.id.tienda, "b2"));
        atajos.add(new Atajo(this, string(R.string.comer), R.id.comer, "b3"));
        atajos.add(new Atajo(this, string(R.string.transporte), R.id.transporte, "b4"));
        atajos.add(new Atajo(this, string(R.string.varios), R.id.restar, "b5"));
        atajos.add(new Atajo(this, string(R.string.ropa), R.id.ropa, "b6"));
        atajos.add(new Atajo(this, string(R.string.cine), R.id.cine, "b7"));
        atajos.add(new Atajo(this, string(R.string.farmacia), R.id.farmacia, "b8"));
        atajos.add(new Atajo(this, string(R.string.varios), R.id.mas, true, "b9"));
        
        atajos.add(new Atajo(this, "Config...", R.id.doble1, "b10"));
        atajos.add(new Atajo(this, "Config...", R.id.doble2, "b11"));

        
        sumar=(ImageButton)findViewById(R.id.sumar);
        sumar.setOnClickListener(this);
        cargar();
        
        
        quitarTeclado();
    
        SharedPreferences pref=PreferenceManager.getDefaultSharedPreferences(this);
        boolean guardarLocalidad=pref.getBoolean("localidad", true);
        
        if(guardarLocalidad) {
	    	LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
	    	locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 
	    			3000000, 0, this);
	    	locationManager.requestLocationUpdates(LocationManager.PASSIVE_PROVIDER, 
	    			3000000, 0, this);
        }
        
 
        
        
    }
    
    public void cargarNombresBotes() {
        nombresBotes[0]=string(R.string.nombreBote0);
        nombresBotes[1]=string(R.string.nombreBote1);
        nombresBotes[2]=string(R.string.nombreBote2);
        nombresBotes[3]=string(R.string.nombreBote3);
        SharedPreferences pref=PreferenceManager.getDefaultSharedPreferences(this);        
        for(int i=0; i<3; i++) {
        	nombresBotes[i]=pref.getString("nombreBote" + i, nombresBotes[i]);
        }
    	
    }
    
    public String string(int id) {
    	return getResources().getString(id);
    }

    @Override
    public View findViewById(int id) {
    	View result=pagina0.findViewById(id);
    	if(result==null) {
    		result=pagina1.findViewById(id);
    	}
    	if(result==null) {
    		result=super.findViewById(id);
    	}
    	return result;
    }
    
	private void quitarTeclado() {
		InputMethodManager imm = (InputMethodManager)getSystemService(
        	      Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(campoCantidad.getWindowToken(), 0);
	}
    
    private void cargar() {
    	SharedPreferences pref=PreferenceManager.getDefaultSharedPreferences(this);   	
    	boteActivo=pref.getInt("boteActivo", 0);
    	
    	TextView tituloBote=(TextView)findViewById(R.id.tituloBote);
    	tituloBote.setText(nombresBotes[boteActivo]);
    	tituloBote.setOnClickListener(new CambiarTituloBote(this));
    	
    	Map<String, ?> valores=pref.getAll();
    	BigDecimal bote=BigDecimal.ZERO;
    	if(valores.containsKey(nomPref("bote"))) {
    		Object valor=valores.get(nomPref("bote"));
    		if(valor instanceof Integer) {
    			bote=BigDecimal.valueOf((long)(Integer)valor);
    		} else {
    			bote=Util.getNumero((String)valores.get(nomPref("bote")));
    		}
    	}
    	
    	campoBote.setText(bote.toString());
    	
    	String tabHistorial=pref.getString(nomPref(PERS_HISTORIAL), "");
    	cargarTablaHistorial(tabHistorial);    	
    }
    
    
    private void cargarTablaHistorial(String historial) {
    	
    	
    	tablaHistorial.removeAllViewsInLayout();
    	
    	String []lineasHistorial=historial.split("\n");
    	boolean par=true;
    	for(String linea:lineasHistorial) {
    		TableRow fila=new TableRow(this);

    		Apunte apunte=Apunte.fromString(linea);
    		if(apunte==null) {
    			continue;
    		}   		
    		
    		// Para la demo
    		
    		// 
    		
    		EscuchadorFila ef=new EscuchadorFila(apunte, par);
    		fila.setOnClickListener(ef);
    		fila.setOnTouchListener(ef);
    		ef.setBackgroundColor(fila);
    		
    		LinearLayout col1=new LinearLayout(this);
    		TableRow.LayoutParams lpCol1=new 
    				TableRow.LayoutParams(0,LayoutParams.WRAP_CONTENT,0.7f);
    		col1.setLayoutParams(lpCol1);
    		col1.setPadding(8, 2, 8, 2);
    		fila.addView(col1);    		
    		col1.setOrientation(LinearLayout.VERTICAL);
    		TextView tvConcepto=new TextView(this);
    		tvConcepto.setTextSize(18);
    		tvConcepto.setText(apunte.getConcepto());
    		col1.addView(tvConcepto);
    		TextView tvFecha=new TextView(this);
    		String stLugar="";
    		if(apunte.getLugar().length()>0) {
    			stLugar=" " + string(R.string.en) + " " + apunte.getLugar();
    		}
    		tvFecha.setText(apunte.getFechaEditada() + stLugar);
    		tvFecha.setTextSize(15);

    		col1.addView(tvFecha);
    		
    		LinearLayout col2=new LinearLayout(this);
    		TableRow.LayoutParams lpCol2=new 
    				TableRow.LayoutParams(0,LayoutParams.WRAP_CONTENT,0.3f);
    		lpCol2.gravity=Gravity.RIGHT;
    		
    		col2.setLayoutParams(lpCol2);    		
    		fila.addView(col2);
    		col2.setOrientation(LinearLayout.VERTICAL);
    		TextView tvCantidad=new TextView(this);
    		tvCantidad.setGravity(Gravity.RIGHT);
    		tvCantidad.setTextSize(20);
    		LinearLayout.LayoutParams lp=new 
    				LinearLayout.LayoutParams(
    						LayoutParams.FILL_PARENT,
    						LayoutParams.FILL_PARENT);
    		lp.gravity=Gravity.RIGHT;
    		tvCantidad.setLayoutParams(lp);
    		tvCantidad.setPadding(8,0,8,0);
    		col2.addView(tvCantidad);
    		
    		String textoVar;
    		if("-".equals(apunte.getOperacion())) {
    			textoVar="-" + apunte.getVariacion().toString();
    		} else {
    			textoVar=apunte.getVariacion().toString();    			
    		}
    		tvCantidad.setText(textoVar);
    		
    		//derecha(addColumna(textoVar, fila));
    		//derecha(addColumna(apunte.getBoteActual().toString(), fila));
    		tablaHistorial.addView(fila);
    		par=!par;
    	}
    }
    
    private View derecha(View col) {
		LinearLayout.LayoutParams lp=(LinearLayout.LayoutParams)col.getLayoutParams();
		lp.gravity=Gravity.RIGHT;
		return col;
    }
    
    private void agregarHistorial(String cadena) {
    	SharedPreferences pref=PreferenceManager.getDefaultSharedPreferences(this);
    	String historial=pref.getString(nomPref(PERS_HISTORIAL),"");
    	SharedPreferences.Editor editor=pref.edit();
    	historial=cadena+"\n"+historial;
    	editor.putString(nomPref(PERS_HISTORIAL), historial);
    	editor.commit();    	
    }
    
    private void guardar(BigDecimal bote) {
    	SharedPreferences pref=PreferenceManager.getDefaultSharedPreferences(this);
    	SharedPreferences.Editor editor=pref.edit();
    	editor.putString(nomPref("bote"), bote.toString());
    	editor.commit();
    	quitarTeclado();
    }
    
    public void cambiarTituloBote(String titulo) {
    	TextView tituloBote=(TextView)findViewById(R.id.tituloBote);
    	tituloBote.setText(titulo);
    	SharedPreferences pref=PreferenceManager.getDefaultSharedPreferences(this);
    	SharedPreferences.Editor editor=pref.edit();
    	editor.putString("nombreBote" + boteActivo, titulo);
    	nombresBotes[boteActivo]=titulo;
    	editor.commit();    	
    }
    
    private void guardarBoteActivo() {
    	SharedPreferences pref=PreferenceManager.getDefaultSharedPreferences(this);
    	SharedPreferences.Editor editor=pref.edit();
    	editor.putInt("boteActivo", boteActivo);
    	editor.commit();
    }
    
    public void onClick(View v) {
    	if(v==botonElegirBote) {
    		elegirBote();
    		return;
    	}
    	try {
    		if(v==sumar) {
	    		doSumar();
	    	}
    	} catch(Exception e) {
    		return;
    	}
    }
    
    public void elegirBote() {
    	AlertDialog.Builder builder=new AlertDialog.Builder(this);
    	builder.setSingleChoiceItems(
    			nombresBotes, boteActivo,
    			new DialogInterface.OnClickListener() {
					
					public void onClick(DialogInterface dialog, int which) {
						Toast.makeText(BoteActivity.this, 
								string(R.string.elegidoBote) +
								" " + nombresBotes[which], Toast.LENGTH_LONG)
								.show();
						setBoteActivo(which);
						guardarBoteActivo();
						dialog.dismiss();
						cargar();
					}
				});
    	
    	AlertDialog dialogo=builder.create();    	
    	dialogo.show();
    }
    
    
    
    public String getCadenaHistorial(String op, String concepto, BigDecimal valor, BigDecimal actual) {
    	Apunte apunte=Apunte.crear(concepto, op, actual, valor, lugar, latitud, longitud);
    	return apunte.toString();
    }
    
    private void doSumar() {
    	BigDecimal suma=Util.getNumero(campoCantidad);
    	if(suma.equals(BigDecimal.ZERO)) {
    		dialogoApunte(string(R.string.aportacion), "+", BigDecimal.ZERO);
    	} else {
    		doAccion(string(R.string.aportacion), suma, "+");    		
    	} 		
    }
    
    public void doRestar(String concepto, BigDecimal cantidadDefecto) {
    	BigDecimal resta=Util.getNumero(campoCantidad);
    	if(Util.isBlank(resta)) {
    		resta=cantidadDefecto;
    	}
    	if(resta==null) {
    		resta=BigDecimal.ZERO;
    	}
    	
    	if(resta.equals(BigDecimal.ZERO)) {
    		dialogoApunte(concepto, "-", BigDecimal.ZERO);
    	} else {
    		doAccion(concepto, resta, "-");
    	}
    }
    
    public void doAccion(String concepto, BigDecimal cantidad, String op) {
    	BigDecimal bote=Util.getNumero(campoBote);
    	if(op.equals("-")) {
    		bote=bote.subtract(cantidad);
    	} else {
    		bote=bote.add(cantidad);
    	}

    	campoBote.setText(bote.toString());
    	guardar(bote);
    	campoCantidad.setText("");
    	agregarHistorial(getCadenaHistorial(op, concepto, cantidad, bote));
    	cargar();
    	vp.setCurrentItem(1, true);
    }

    public  BigDecimal getCantidad() {
    	return Util.getNumero(campoCantidad);
    }
    
    public void dialogoApunte(String concepto, final String op, BigDecimal cantidad) {
		final Dialog dialogo=new DialogoApunte(BoteActivity.this);		
		dialogo.setCancelable(true);
		dialogo.setTitle(string(R.string.intApunte));			
		dialogo.setContentView(R.layout.apunte);
		final EditText etConcepto=(EditText)dialogo.findViewById(R.id.concepto);
		etConcepto.setText(concepto);
		final EditText etCantidad=(EditText)dialogo.findViewById(R.id.cantidad);
		if(!cantidad.equals(BigDecimal.ZERO)) {
			etCantidad.setText(cantidad.toString());
		}
		
		Button aceptar=(Button)dialogo.findViewById(R.id.aceptar);
		aceptar.setOnClickListener(new OnClickListener() {
			public void onClick(View arg0) {
				String concepto=etConcepto.getText().toString();
				try {
					BigDecimal cantidad=Util.getNumero(etCantidad);
					doAccion(concepto, cantidad, op);
					dialogo.cancel();
				} catch(Exception e) {
					Toast.makeText(BoteActivity.this,
							string(R.string.errorCantidad),						
							Toast.LENGTH_LONG).show();					
				}
			}
		});
		
		dialogo.show();
		
    }
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
    	 MenuInflater inflater = getMenuInflater();
    	    inflater.inflate(R.menu.menu, menu);
    	    return true;
   }
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
    	switch(item.getItemId()) {
	    	case R.id.borrarTodo:
	    		borrarTodo();
	    		break;
	    	case R.id.enviar: 
	    		try {
	    			enviarPorCorreo();
	    		} catch(IOException e) {
	    			Toast.makeText(this, "Error : " +
	    				e.getClass().getName() + " " +
	    				e.getMessage(), Toast.LENGTH_LONG)
	    				.show();
	    		}
	    		break;
	    	case R.id.preferencias:
	    		Intent preferenciasActivity = new Intent(getBaseContext(),
                        Preferencias.class);
	    		startActivity(preferenciasActivity);	    		
	    		break;
	    	case R.id.borrarUltimo:
	    		borrarUltimoApunte();
    	}
    	return true;
    }
    
    public void borrarUltimoApunte() {
    	SharedPreferences pref=PreferenceManager.getDefaultSharedPreferences(this);
    	String historial=pref.getString(nomPref(PERS_HISTORIAL), "");
    	if(historial==null) {
    		return;
    	}
    	String []lineasHistorial=historial.split("\n");
    	if(lineasHistorial==null || lineasHistorial.length==0) {
    		return;
    	}
    	Apunte apunte=Apunte.fromString(lineasHistorial[0]); 
    	if(apunte==null) {
    		return;
    	}
    	apunte.getOperacion();
    	apunte.getVariacion();

    	BigDecimal bote=Util.getNumero(campoBote);
    	if("-".equals(apunte.getOperacion())) {
    		bote=bote.add(apunte.getVariacion());
    	} else {
    		bote=bote.subtract(apunte.getVariacion());
    	}
    	campoBote.setText(bote.toString());
    	guardar(bote);
    	campoCantidad.setText("");

    	StringBuffer cadenaHistorial=new StringBuffer();
    	for(int i=1; i<lineasHistorial.length; i++) {
    		if(i>1) {
    			cadenaHistorial.append("\n");
    		}
    		cadenaHistorial.append(lineasHistorial[i]);
    	}
    	
    	SharedPreferences.Editor editor=pref.edit();    	
    	editor.putString(nomPref(PERS_HISTORIAL), cadenaHistorial.toString());
    	editor.commit();    	
    	cargar();
    	
    	
    }
    
    public void borrarTodo() {
		new AlertDialog.Builder(this)
        .setIcon(android.R.drawable.ic_dialog_alert)
        .setTitle(string(R.string.titBorrarTodo))
        .setMessage(string(R.string.preguntaBorrarTodo))
        	.setPositiveButton(string(R.string.si), new DialogInterface.OnClickListener() {
        		public void onClick(DialogInterface dialog, int which) {
        			borrarTodoDefinitivamente();        			
        		}

        })
        .setNegativeButton(string(R.string.no), null)
        .show();	    		    	
    }
    
    public void borrarTodoDefinitivamente() {
		SharedPreferences pref=PreferenceManager.getDefaultSharedPreferences(this);
    	SharedPreferences.Editor editor=pref.edit();
    	editor.remove(nomPref("bote"));
    	editor.remove(nomPref(PERS_HISTORIAL));
    	editor.commit();	
    	cargar();
    }
    
    public void enviarPorCorreo() throws IOException {
    	File directorio=getExternalFilesDir(null);
    	if(directorio==null) {
    		directorio=getCacheDir();
    	}
    	directorio.mkdirs();
    	File fichero=
    			new File(directorio + File.separator + 
    					"bote-" 
    					+ new SimpleDateFormat("yyyy-MM-dd").format(new Date())    					
    					+ ".xls");
    	
    	fichero.delete();
    	FileOutputStream f=new FileOutputStream(fichero);

    	
    	String texto=string(R.string.comentarioMail);
    	SharedPreferences pref=PreferenceManager.getDefaultSharedPreferences(this);
    	String historial=pref.getString(nomPref(PERS_HISTORIAL), "");
    	String []lineasHistorial=historial.split("\n");
    	f.write(
    			(
    			string(R.string.concepto) + "\t" +
    			string(R.string.fecha) + "\t" +
    			string(R.string.lugar) + "\t" + 
    			string(R.string.operacion) + "\t" +
    			string(R.string.cantidad) + "\t" +
    			string(R.string.bote)

    			+ "\r\n").getBytes());
    	for(String lineaHistorial:lineasHistorial) {
    		Apunte apunte=Apunte.fromString(lineaHistorial);
    		if(apunte==null) {
    			continue;
    		}
    		String linea=
    			apunte.getConcepto() + SEPARADOR +
    			apunte.getFechaAbsoluta() + SEPARADOR +
    			apunte.getLugar() + SEPARADOR +
    			apunte.getOperacion() + SEPARADOR +
    			apunte.getVariacion().toString().replaceAll("\\.",",") + SEPARADOR +
    			apunte.getBoteActual().toString().replaceAll("\\.",",") + FIN_LINEA;
    		f.write(linea.getBytes());
    		//texto=texto+linea;
    	}
    	f.close();
    	
    	final Intent emailIntent = new Intent(
    			android.content.Intent.ACTION_SEND);
		emailIntent.setType("plain/text");	 
		 
		emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, 
				string(R.string.titMail));
		
		SharedPreferences prefs = PreferenceManager
				.getDefaultSharedPreferences(getBaseContext());
		String toPref= prefs.getString("toPref", "");
		emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL,
				new String[] { toPref });
								
		emailIntent.putExtra(Intent.EXTRA_STREAM,		
				Uri.parse("file://" + fichero.getAbsolutePath()));
		 
		emailIntent.putExtra(android.content.Intent.EXTRA_TEXT,
				texto				
				);
		 
		this.startActivity(Intent
				.createChooser(emailIntent, "Send mail..."));    	    	
    }

    
    public static class DialogoApunte extends Dialog {
    	public DialogoApunte(Context contexto) {
    		super(contexto);
		}
    	
    	
    	@Override
    	public void onAttachedToWindow() {
    		Button aceptar=(Button)findViewById(R.id.aceptar);
    		final EditText etCantidad=(EditText)findViewById(R.id.cantidad);
    		aceptar.requestFocus();
    	}
    }
    
    public void onLocationChanged(final Location location) {
    	 new Thread(new Runnable(){
             public void run(){
                 setLugar(location.getLatitude(), location.getLongitude());
             }
         }).start();    	
    }
    
    public void setLugar(double latitud, double longitud) {
    	try {
    		this.latitud=latitud;
    		this.longitud=longitud;
	    	Geocoder gcd = new Geocoder(this, Locale.getDefault());
	    	List<Address> addresses = gcd.getFromLocation(
	    			latitud, 
	    			longitud, 1);
	    	if (addresses.size() > 0) {    		
	            lugar=addresses.get(0).getLocality();
	            if(lugar==null) {
	            	lugar="";
	            }
	    	} 
    	} catch(IOException e) {

    	}    	
    }


	public void onProviderDisabled(String provider) {
		// TODO Auto-generated method stub
	}


	public void onProviderEnabled(String provider) {
		// TODO Auto-generated method stub
	}

	public void onStatusChanged(String provider, int status, Bundle extras) {
		// TODO Auto-generated method stub		
	}    
	
	public String nomPref(String nombre) {
		return clavesBotes[boteActivo] + nombre;
	}
    
}